Zwrot i ryzyko

Najważniejsze miary zwrotów i ryzyka - metody pomiaru i przykłady.

Wariancja portfela

\[ \scriptsize \sigma^2_{pf} = \begin{bmatrix} w_1 & w_2 & \ldots & w_n \end{bmatrix}\begin{bmatrix}\sigma_1^2 & \sigma_{1,2} & \ldots & \sigma_{1,n} \\\sigma_{2,1} & \sigma_2^2 & \ldots & \sigma_{2,n} \\\vdots & \vdots & \ddots & \vdots \\\sigma_{n,1} & \sigma_{n,2} & \ldots & \sigma_n^2 \\\end{bmatrix}\begin{bmatrix}w_1 \\w_2 \\\vdots \\w_n \\\end{bmatrix} \] \[ \small{ \sigma^2_{pf} - \text{wariancja portfela} \\ w_1,\ w_2,\ \ldots,\ w_n - \text{wagi aktywów} \\ \sigma^2_i - \text{wariancja aktywa } i \\ \sigma_{i, j} - \text{kowariancja aktywów } i \text{ i } j} \]

Stopy zwrotu:
                NVDA      INTC      MSFT     GOOGL
Date                                              
2006-01-05  0.022217  0.014299  0.000663  0.013476
2006-01-06  0.016502  0.001424 -0.002872  0.031956
2006-01-09  0.027954  0.006162 -0.001950  0.002663
...
                NVDA      INTC      MSFT     GOOGL
Date                                              
2015-12-29  0.016290  0.014625  0.010722  0.014983
2015-12-30 -0.008631 -0.012676 -0.004214 -0.004610
2015-12-31 -0.012862 -0.015450 -0.014792 -0.015551
Macierz kowariancji:
  NVDA INTC MSFT GOOGL
NVDA 0.232769 0.082104 0.059808 0.063543
INTC 0.082104 0.088772 0.050173 0.041313
MSFT 0.059808 0.050173 0.078721 0.042340
GOOGL 0.063543 0.041313 0.042340 0.095787

Wariancja portfela: 0.07341312787559849 ≈ 0.07 (!)
Odchylenie standardowe portfela: 0.2709485705361785 ≈ 0.27

Stopy zwrotu

  • Średnia stopa zwrotu
  • Skumulowana stopa zwrotu
  • Roczna stopa zwrotu
  • Zannualizowana stopa zwrotu - roczna stopa zwrotu odpowiadająca wynikom z dowolnego okresu czasu

Średni zwrot vs zwrot zannualizowany

  Rok Wartość portfela Zwrot
0 Rok 1 100 None
1 Rok 2 200 100%
2 Rok 3 100 -50%
  • Średnia stopa zwrotu -> (100-50)/2=25 [%]
  • Rzeczywista roczna stopa zwrotu (annualized return) -> 0 [%]

Jak porównywać ze sobą portfele z różnymi okresami inwestycji? Co z kapitalizacją?

Annualizacja

Annualizacja oznacza przekształcenie danych krótkoterminowych w dane całoroczne. Jest to swego rodzaju prognoza, bazująca na ekstrapolacji wyników uzyskanych w jednym okresie. Opiera się ona na założeniu, że gdyby przez resztę roku sytuacja była taka sama jak w pierwszym kwartale, to w całym roku osiągniemy podobny wynik. Przykładowo, jeśli wzrost PKB w danym kwartale wyniósł 1% kdk, to annualizowane tempo wzrostu wyniosło 4,06%.[1]

Annualizacji można dokonywać także na danych z okresów powyżej jednego roku.

\[ A=(1+T)^{1/N}-1 \]

\[ T - \text{ skumulowana stopa zwrotu} \\ N - \text{ liczba lat inwestycji} \\ A - \text{ zannualizowana roczna stopa zwrotu } \]

[1] Artykuł dostępny na Bankier.pl.z

Zwroty skorygowane o ryzyko

Portfel 1 -> równoważny


Wariancja portfela 1: 0.07341312787559849 ≈ 0.07 (!)
Odchylenie standardowe portfela 1: 0.2709485705361785 ≈ 0.27
Zannualizowana stopa zwrotu portfela 1: 12.64%

Portfel 2 -> tylko GOOGL


Wariancja portfela 2: 0.0957868886434425 ≈ 0.10 (!)
Odchylenie standardowe portfela 2: 0.30949456965097544 ≈ 0.31
Zannualizowana stopa zwrotu portfela 2: 13.59%

Który z tych portfeli jest lepszy?

Przykład:

Wskaźnik Sharpe’a

\[ \small{ S = (R_j-R_f)\cdot{\sigma_j}^{-1} \\ S - \text{współczynnik Sharpe'a} \\ R_j - \text{zannualizowana średnia stopa zwrotu portfela} \\ R_f - \text{stopa zwrotu wolna od ryzyka} \\ \sigma_j - \text{odchylenie standardowe portfela (zannualizowane!)}} \]

Chodzi o to, by ocenić, jak dobrze inwestycja wynagradza inwestora za podjęte ryzyko, w porównaniu do alternatyw, które nie niosą ryzyka (czyli inwestycji wolnych od ryzyka).

Wskaźnik Sharpe'a portfela 1 (równoważny): 0.32
Wskaźnik Sharpe'a portfela 2 (tylko GOOGL): 0.31
  • \(S \approx 1\) oznacza, że ​​zwrot z inwestycji jest proporcjonalny do podjętego ryzyka. Współczynnik Sharpe’a mniejszy od 1 oznacza, że ​​zwrot z inwestycji jest mniejszy niż podjęte ryzyko.

  • Portfele o wyższej wartości współczynnika Sharpe’a – uzyskują większe stopy zwrotu przy takim samym poziomie ryzyka.

  • Ujemna wartość wskaźnika oznacza iż portfel osiągnął stopę zwrotu niższą niż stopa wolna od ryzyka.

  • Wskaźnik odwołuje się do danych historycznych, a więc jego (wysoka) wartość nie gwarantuje osiągnięcia podobnego wyniku w przyszłości.

Ile lat wstecz powinniśmy patrzeć, obliczając zwroty skorygowane o ryzyko?

1. Analiza długoterminowa (np. 10 lat)

  • Zalety:

    • Uwzględnia wiele cykli rynkowych (np. okresy hossy i bessy).

    • Stabilizuje wpływ krótkoterminowych anomalii rynkowych.

    • Dobre do analizy portfeli o charakterze strategicznym, zorientowanych na długoterminowy wzrost.

    Wady

    • Dane sprzed 10 lat mogą nie być już reprezentatywne, ponieważ rynki i gospodarka się zmieniają.

    • Historyczna stopa wolna od ryzyka i zmienność mogą być inne niż obecnie, co zniekształci wynik.

2. Analiza krótkoterminowa (np. 1 rok)

  • Zalety:

    • Lepsze odwzorowanie aktualnych warunków rynkowych (np. bieżąca inflacja, stopy procentowe).

    • Bardziej użyteczne przy ocenie wyników portfela zarządzanego dynamicznie lub funduszy inwestycyjnych zmieniających strategię.

    • Przydatne do szybkiej analizy efektywności portfela w warunkach zwiększonej zmienności, jak np. po pandemii czy kryzysie finansowym.

    Wady:

    • Może być podatne na krótkoterminowe anomalie, np. efekt pandemii COVID-19, kryzysy energetyczne.

    • Może nie odzwierciedlać pełnego ryzyka portfela w różnych cyklach rynkowych.

Nienormalne rozkłady stóp zwrotu

Skośność:
Miara asymetrii rozkładu stóp zwrotu portfela.

  • \(\textbf{S}>0\) - tendencja do uzyskiwania bardziej skrajnych dodatnich stóp zwrotu (prawoskośność).

  • \(\textbf{S}<0\) - większe ryzyko skrajnych strat (lewoskośność)

  • \(\textbf{S}=0\) - rozkład symetryczny.

Kurtoza:
Miara “spiczastości” rozkładu i obecności wartości ekstremalnych (ryzyka ogonowego).

  • \(\textbf{K}>3\) - rozkład leptokurtyczny (większe ryzyko ekstremalnych zdarzeń).

  • \(\textbf{K}<0\) - rozkład platykurtyczny (mniejsze ryzyko ekstremalnych odchyleń).


Skośność portfela 1: 0.19
Kurtoza portfela 1: 6.57
Skośność portfela 2: 0.90
Kurtoza portfela 2: 12.26

Analiza portfela względem benchmarku

Aktywna stopa zwrotu

  • Miara efektywności inwestycji względem indeksu referencyjnego
  • Obliczana jako różnica między stopami zwrotu rozważanej inwestycji i benchmarku
  • Odpowiedni dobór wag → wysoka aktywna stopa zwrotu
  • Dla pasywnych funduszy inwestycyjnych i funduszy indeksowych (śledzących) aktywna stopa zwrotu jest interpretowana jako błąd śledzenia

Aktywne wagi

Instrumenty w portfelu inwestycyjnym mogą być:

  • Przeważone - gdy ich udział w portfelu inwestycyjnym jest większy niż w benchmarku
  • Niedoważenie - gdy ich udział w portfelu inwestycyjnym jest mniejszy niż w benchmarku

Implementacja w Pythonie

Sprawdzenie, czy wagi sumują się do 100%

print(portfolio_data.pf_weights.sum())
100.0

Obliczanie całkowitych zwrotów dla portfela i indeksu referencyjnego

total_return_pf = (portfolio_data['pf_weights']*portfolio_data['mean_return']).sum()
total_return_bm = (portfolio_data['bm_weights']*portfolio_data['mean_return']).sum()

Obliczanie aktywnego zwrotu

active_return = total_return_pf - total_return_bm
print ("%.2f%%" % active_return)
22.58%

Analiza ze względu na sektor

grouped_df=portfolio_data.groupby('GICS Sector').sum()
grouped_df['active_weight']=grouped_df['pf_weights']-grouped_df['bm_weights']
print (grouped_df['active_weight'])
GICS Sector
Consumer Discretionary         20.257
Consumer Staples               -5.176
Energy                          0.000
Financials                     -2.116
Health Care                     2.865
Industrials                     2.465
Information Technology          8.693
Materials                      -2.043
Real Estate                     2.014
Telecommunications Services    -1.367
Utilities                     -25.593
Name: active_weight, dtype: float64

Czynniki ryzyka

  • Cechy instrumentów finansowych zawartych w portfelu, wpływające na zmianę jego wartości - stratę lub zysk
  • Dzielimy je na:
    • makroekonomiczne: stopy procentowe, kursy walut, przepisy prawne, etc.
    • strategiczne: wielkość, wartość, zmienność, dynamika, etc.

Zastosowania czynników ryzyka

Implementacja w Pythonie

Obliczamy współczynniki korelacji między zwrotami S&P500 a czynnikami dynamiki i wartości

df['correlation_mom']=df['S&P500'].rolling(20).corr(df['WML'])
df['correlation_value']=df['S&P500'].rolling(20).corr(df['value_factor'])

Generujemy wykres korelacji w czasie

plt.clf()
plt.plot(df['correlation_mom'], label = "momentum")
plt.plot(df['correlation_value'], label = "value")
plt.title("Korelacja między czynnikami ryzyka a stopą zwrotu indeksu S&P500")
plt.legend()
plt.show()

Teraz sprawdźmy jak czynnik wartości wpływa na zmianę wartości portfela inwestycyjnego

factor_data.corr()
                   WML  value_factor  portfolio
WML           1.000000     -0.363237   0.001012
value_factor -0.363237      1.000000   0.767663
portfolio     0.001012      0.767663   1.000000
plt.clf()
factor_data['correlation_value']=factor_data['portfolio'].rolling(5).corr(factor_data['value_factor'])
factor_data['correlation_value'].plot()
plt.legend()
plt.show()

Fama French Multi Factor Model

\[ R_{pf}=\alpha + \beta_mMKT + \beta_s SMB + \beta_h HML \]

  • MKT (market return) to różnica między stopą zwrotu rynkowego a stopą wolną od ryzyka \(R_m - R_f\)
  • SML (small minus big) czynnik rozmiaru
  • HML (high minus low) czynnik wartości
  • Współczynniki \(\beta_{(.)}\) mowią nam w jakim stopniu konkretny czynnik wyjaśnia zmiany stopy zwrotu z naszego portfela (współczynniki regresji)
  • \(\alpha\) reprezentuje nadwyżkowy zwrot, który nie jest wyjaśniony przez model (czynnik losowy)

Implementacja w Pythonie

Macierz korelacji dla danych w tabeli

factor_returns.corr()
              Mkt-RF       SMB       HML        RF  pf_returns
Mkt-RF      1.000000  0.331250  0.099800  0.087073    0.738586
SMB         0.331250  1.000000 -0.108081  0.076750    0.162303
HML         0.099800 -0.108081  1.000000 -0.049019   -0.237647
RF          0.087073  0.076750 -0.049019  1.000000    0.039383
pf_returns  0.738586  0.162303 -0.237647  0.039383    1.000000

Definiujemy model regresji liniowej

model = sm.regression.linear_model.OLS(factor_returns['pf_returns'], factor_returns[['Mkt-RF','SMB', 'HML']]).fit()

Dokonujemy predykcji

predictions = model.predict(factor_returns[['Mkt-RF','SMB', 'HML']]) 

Podsumowanie modelu

model.summary()
OLS Regression Results
Dep. Variable: pf_returns R-squared (uncentered): 0.657
Model: OLS Adj. R-squared (uncentered): 0.653
Method: Least Squares F-statistic: 158.8
Date: wt., 25 mar 2025 Prob (F-statistic): 1.55e-57
Time: 19:06:42 Log-Likelihood: -185.67
No. Observations: 252 AIC: 377.3
Df Residuals: 249 BIC: 387.9
Df Model: 3
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Mkt-RF 0.8234 0.040 20.627 0.000 0.745 0.902
SMB -0.2272 0.064 -3.545 0.000 -0.353 -0.101
HML -0.4826 0.056 -8.611 0.000 -0.593 -0.372
Omnibus: 143.224 Durbin-Watson: 1.925
Prob(Omnibus): 0.000 Jarque-Bera (JB): 1746.552
Skew: 1.972 Prob(JB): 0.00
Kurtosis: 15.279 Cond. No. 1.89


Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
b1, b2, b3 = model.params

print ('Współczynniki dla poszczególnych czynników:\nMkt-Rf: %f\nSMB: %f\nHML: %f' %  (b1, b2, b3))
Współczynniki dla poszczególnych czynników:
Mkt-Rf: 0.823443
SMB: -0.227198
HML: -0.482598

Narzędzia do analizy portfela inwestycyjnego

  • Backtesting - testowanie modelu na danych historycznych
  • Performance attrubution - analiza składowych wyników inwestycyjnych
  • PyFolio - darmowe narzędzie do przeprowadzania kompleksowych analiz portfela

Źródła

  1. Price & Volume Data for All US Stocks & ETFs
    Marjanovic, B. (2021). Kaggle.

  2. Sharpe Ratio (Investopedia)

  3. Annualized Total Return (Investopedia)

  4. Sharpe Ratio Explained
    Edspira. (2020). YouTube.

  5. Czym jest annualizowany PKB? Tłumaczymy
    Bankier.pl. (2020).